/*memorydata of vest
  2017.09.14 by zcq
*/

#ifndef MEMORYDATA_H
#define MEMORYDATA_H


/*  
#ifdef DLL_MEMDATA   
#define DLL_API_MEMDATA extern __declspec(dllexport)  
#else  
#define DLL_API_MEMDATA extern __declspec(dllimport)  
#endif*/
#define DLL_API_MEMDATA extern

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>

#ifdef __REFACTOR__
#include "Mock.h"
#else
#include "vest.h" 
#endif


namespace mem {

enum MemoryIndex {
    INDEX_BAODAN            = 1, // 报单（Declaration）
    INDEX_CHENGJIAODAN      = 2, // 成交单（）
    INDEX_JIAOGE            = 3, // 交割单（）
    INDEX_JG_CHENGJIAODAN   = 4, // 交割成交单（）
    INDEX_ZHONGLICANG       = 5, // 中立仓（）
    INDEX_ZLC_CHENGJIAODAN  = 6, // 中立仓成交单（）
    INDEX_GONGGAO           = 7, // 公告
    INDEX_MAX               = 8,
};

#define MAX_BAODAN_COUNT               3000000  // 300万
#define MAX_CHENGJIAODAN_COUNT         2000000  // 100万->150万，9月20日修改 -》2000000
#define MAX_JIAOGE_COUNT               100000  // 10万
#define MAX_JG_ZLC_CHENGJIAODAN_COUNT  100000  // 10万
#define MAX_ZHONGLICANG_COUNT          100000  // 10万
#define MAX_GONGGAO_COUNT              100

#define MAX_MISSING_COUNT              10000  // 这里为了防止异常情况，当X05处理值跳跃该值时则重置处理
#define MAX_MISSING_TIMES              10000  // 这里为了防止异常情况，当缺失值在指定次数内未出现则删除（注意，最大只能为65535，short）
typedef struct {
	int value;
	unsigned short times;
} SMISS;

#define LENGTH_CJD 20  // 成交单编号长度
#define NIGHT_BEGIN_TIME 180000 // 夜市开始时间
#define DAY_BEGIN_OFFSET 240000-NIGHT_BEGIN_TIME // 日间开始时间偏移
#define ERROR_OPEN_FILE  -1   // 打开文件错误
#define ERROR_FILE_WRITE -2   // 写文件错误
#define ERROR_FILE_READ  -3   // 读取文件错误
#define ERROR_FILE_SEEK  -4   // 移动文件指针错误

//排序类型
#define SORT_ASC  true     // 顺序
#define SORT_DESC false    // 倒序
#define POSITION_ABSOLUTE true  // 绝对位置
#define POSITION_RELATIVE false // 相对位置
#define LOCK_SHARED   'r'     // 共享方式锁数据（多读可进入、写不进入）
#define LOCK_UNIQUE   'w'     // 独占方式锁数据（仅可写）

#define O05_JIAOGE      '0' // 交割
#define O05_ZHONGLICANG '1' // 中立仓

typedef struct {
	int count; // 本次数量
	int index; // 第一条数据位置
	int total; // 总数据量
} SCOUNT;

// 合约类型
#define I10_Ag_TD   0
#define I10_Ag999   1
#define I10_Ag9999  2
#define I10_Au_TD   3
#define I10_Au_TN1  4
#define I10_Au_TN2  5
#define I10_Au100g  6
#define I10_Au50g   7
#define I10_Au995   8
#define I10_Au9995  9
#define I10_Au9999  10
#define I10_Pt9995  11
#define I10_iAu100g 12  // i开头为国际版
#define I10_iAu995  13
#define I10_iAu9999 14
#define I10_mAu_TD  15  // m开头为迷你金

// I00: 市场类型 0-现货,1-即期,2-延期
// O15: 报单指令类型 0-普通限价,1-限价FOK(不完全成交全部撤单),2-限价FAK(未成交的撤单),3-市价剩余转限价,4-市价FOK,5-市价FAK
// O02: 买卖方向 b-买,s-卖
// O09: 订单状态 o-末成交,p-部分成交,c-完全成交,d-用户删除,s-系统删除,u-应急撤单,a-自动撤单,e-正在报入,2-无效,3-部成部撤
// O03: 开平标志 0-开仓,1-平仓,2-强行平仓
// O65: 类型 1-普通,2-应急,6-套保
// T82: 来源 1-会员服务系统,2-二级系统,3-应急资金划转,4-仓储交割系统,a-APP渠道,c-红马甲

typedef struct {
	//int  iO00; // 报单编号（16位，交易日，8位序号）9位数字（01000001、021000085） 显示排序1；查询排序3
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30; // 客户代码（12位）10位数字  筛选条件5； 查询排序1
	int  iT11; // 申请日期（yyyyMMdd）
	int  iT12; // 申报时间（HH:MM:SS） 显示排序2；查询排序5
	int  iT22; // 撤消时间（HH:MM:SS）
	int  iX05; // 消息序号，8~9位数字(唯一序号) 更新的依据，报文存在 同一O00报文的多个X05, 最大的X05为最新。
	int  iM20; // 交易席位代码（4位会员代码，2位序号）  筛选条件4；
	int  iO07; // 申报数量 8全数字 查询排序6
	int  iO08; // 剩余数量，8位数字 
	int  iO06; // 申报价格，8位数字 查询排序5
	int  iT12_part;  // T12(若大于20点则-200000，小于20点则+40000)
	short sM20_part; // M20的前四位
	char sM60[10 + 1]; // 交易员代码 10位字母数字字符
	char sT02[10 + 1]; // 撤消员代码 10位字母数字字符
	char sO01[14 + 1]; // 本地报单号 14位数字
	char cI10; // 合约代码    筛选条件1；查询排序2
	char cI00; // 市场
	char cO15; // 报单指令类型 筛选条件2；
	char cO02; // 买卖方向    查询排序4
	char cO09; // 订单状态    筛选条件3；
	char cO03; // 开平标志
	char cO65; // 类型
	char cT82; // 来源
} SBAODAN; // 报单结构体

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30;          // 客户代码    筛选条件2         10位数字，不唯一            查询3   排序2
	int  iM20;          // 席位代码    筛选条件3          6位数字，不唯一            查询4
	int  iO61;          // 成交日期                       6位数字，不唯一
	int  iO62;          // 成交时间                       6位数字，不唯一
	int  iO63;          // 成交价格                      数字类型，不唯一                    排序3
	int  iO64;          // 成交数量                      数字类型，不唯一
	int  iX05;          // 消息序号，8~9位数字(唯一序号) 更新的依据，报文存在 同一O00报文的多个X05, 最大的X05为最新。
	int  iO62_part;     // O62(若大于20点则-200000，小于20点则+40000)           排序6
	short sM20_part;    // 会员编号 M20的前四位									   查询7
	char sO01[14 + 1];    // 本地报单号 14位数字
	char sO60[LENGTH_CJD + 1];    // 成交编号9位                  16位数字字符串，不唯一      查询6   排序5
	char cI10;          // 合约代码    筛选条件1          1或2位数字，取值为 1-18    查询1   排序1
	char cI00;          // 市场							0或1或2                    查询2
	char cO65;          // 成交类型                       1位数字,不唯一
	char cO02;		    // 买卖方向						1位字符，b或s
	char cO03;          // 开平标志						1位字符，0或1或2
} SCHENGJIAODAN; // 成交单结构体


#define STDANDARD_WEIGHT_LEN 32 //T52标准重量长度，一方面满足域字典规定，在12位纯整数情况下12（整数部分）+1（小数点）+3（精度）
								//另一方面考虑内存算法占用内存的大小；
								//域字典定义N(12,6),N(x,y) x代表总位数，y代表小数点后的最长位数 add 20211118 liux

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30; // 客户代码（12位）10位数字  筛选条件5； 查询排序1
	int  iT11; // 申请日期（yyyyMMdd）
	int  iT12; // 申报时间（HH:MM:SS） 显示排序2；查询排序5
	int  iT22; // 撤消时间（HH:MM:SS）
	int  iX05; // 消息序号，8~9位数字(唯一序号) 更新的依据，报文存在 同一O00报文的多个X05, 最大的X05为最新。
	int  iM20; // 交易席位代码（4位会员代码，2位序号）  筛选条件4；
	int  iO07; // 申报数量 8全数字 查询排序6
	int  iO08; // 剩余数量，8位数字
	int  iT12_part;  // T12(若大于20点则-200000，小于20点则+40000)
	short sM20_part; // M20的前四位
	char sM60[10 + 1]; // 交易员代码 10位字母数字字符
	char sT02[10 + 1]; // 撤消员代码 10位字母数字字符
	char sO01[14 + 1]; // 本地报单号 14位数字
	char sV001[10];  // 交割品种代码1 10位字母数字字符串
	char sT521[STDANDARD_WEIGHT_LEN];  // 标准重量1     //从10位改为32位 20211118
	char sV002[10];  // 交割品种代码2 10位字母数字字符串
	char sT522[STDANDARD_WEIGHT_LEN];  // 标准重量2     //从10位改为32位 20211118
	char cI10; // 合约类型    筛选条件1；查询排序2
	char cI00; // 市场
	char cO15; // 报单指令类型 筛选条件2；
	char cO02; // 买卖方向    查询排序4
	char cO09; // 订单状态    筛选条件3；
} SJIAOGE; // 交割报单结构体

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30; // 客户代码（12位）10位数字  筛选条件5； 查询排序1
	int  iT11; // 申请日期（yyyyMMdd）
	int  iT12; // 申报时间（HH:MM:SS） 显示排序2；查询排序5
	int  iT22; // 撤消时间（HH:MM:SS）
	int  iX05; // 消息序号，8~9位数字(唯一序号) 更新的依据，报文存在 同一O00报文的多个X05, 最大的X05为最新。
	int  iM20; // 交易席位代码（4位会员代码，2位序号）  筛选条件4；
	int  iO07; // 申报数量 8全数字 查询排序6
	int  iO08; // 剩余数量，8位数字
	int  iT12_part;  // T12(若大于20点则-200000，小于20点则+40000)
	short sM20_part; // M20的前四位
	char sM60[10 + 1]; // 交易员代码 10位字母数字字符
	char sT02[10 + 1]; // 撤消员代码 10位字母数字字符
	char sO01[14 + 1]; // 本地报单号 14位数字
	char sV001[10];  // 交割品种代码1 10位字母数字字符串
	char sT521[STDANDARD_WEIGHT_LEN];  // 标准重量1    //从10位改为32位 20211118
	char sV002[10];  // 交割品种代码2 10位字母数字字符串
	char sT522[STDANDARD_WEIGHT_LEN];  // 标准重量2    //从10位改为32位 20211118
	char cI10; // 合约类型    筛选条件1；查询排序2
	char cI00; // 市场
	char cO15; // 报单指令类型 筛选条件2；
	char cO02; // 买卖方向    查询排序4
	char cO09; // 订单状态    筛选条件3；
}  SZHONGLICANG; // 中立仓报单结构体

typedef struct {
	__int64  iM30;          // 客户代码    筛选条件2         10位数字，不唯一            查询3   排序2
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	int  iM20;          // 席位代码    筛选条件3          6位数字，不唯一            查询4
	int  iO61;          // 成交日期                       6位数字，不唯一
	int  iO62;          // 成交时间                       6位数字，不唯一
	int  iO64;          // 成交数量                      数字类型，不唯一
	int  iX05;          // 消息序号，8~9位数字(唯一序号) 更新的依据，报文存在 同一O00报文的多个X05, 最大的X05为最新
	int  iO62_part;     // O62(若大于20点则-200000，小于20点则+40000)           排序6
	short sM20_part;    // 会员编号 M20的前四位
	char sO01[14 + 1];    // 本地报单号 14位数字
	char sO60[LENGTH_CJD + 1];    // 成交编号9位                  16位数字字符串，不唯一      查询6   排序5
	char cO05;          // 是否中立仓，0是交割成交单，1是中交仓成交单  				   查询7
	char cI10;          // 合约代码    筛选条件1          1或2位数字，取值为 1-18    查询1   排序1
	char cI00;          // 市场							0或1或2                    查询2
	char cO02;		    // 买卖方向						1位字符，b或s
} SJG_ZLC_CHENGJIAODAN; // 交割、中立仓成交单结构体

typedef struct {
	int  iM20;       // 席位代码
	int  iT80;       // 序号，唯一，可按此序号排序
	int  iQ82;       // 发布日期                       6位数字，不唯一
	int  iQ83;       // 发布时间
	int  iX05;       // 消息序号，8~9位数字(唯一序号) 更新的依据，报文存在 同一O00报文的多个X05, 最大的X05为最新
	char sG10[10 + 1]; // 部门代码
	char sG20[10 + 1]; // 操作员代码
	char sQ84[40 * 3 + 10]; // 标题，包含中文，最长40个，是否需要考虑中文特殊
	char sQ85[1024 * 3 + 10];//内容，包含中文，最长1024个
} SGONGGAO; // 公告信息

#define FIELD_GONGGAO_NONE      -1 // 仅信息序号排序

#define NOT_FOUND       -1
#define NOT_FOUND_LEFT  -1
#define NOT_FOUND_RIGHT -2

// 筛选结构体，不参加筛选的条件，char数组用0x00, 数值（char,short,int,long）用 -1表示不参加筛选
// 查询结构体，不参加查询的条件，char数组用0x00, 数值（char,short,int,long）用 -1表示不参加查询
typedef struct {
	int  iM20;  // 交易席位代码
	char cI10;	// 合约类型
	char cO09;  // 订单类型
	char cO15;  // 报单指令类型
	__int64  iM30;  // 客户编号
} SFILTER_BAODAN; // 报单筛选条件

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30;  // 客户编号
	int  iM20;  // 交易席位代码
	short sM20_part; // 会员代码（M20的前四位）
	char cI00;  // 市场
	char cI10;	// 合约类型
	char cO03;  // 开平
	char cO02;  // 买卖方向
} SQUERY_BAODAN;

#define FIELD_BAODAN_NONE      -1 // 仅申报单号排序         查询排序3
#define FIELD_BAODAN_iT12_part 0  // 申报时间 + 报单编号排序 查询排序4
#define FIELD_BAODAN_iM30      1  // 客户代码 + 报单编号排序 查询排序1
#define FIELD_BAODAN_cI10      2  // 合约代码 + 报单编号排序 查询排序2
#define FIELD_BAODAN_iO06      3  // 申报价格 + 报单编号排序 查询排序5
#define FIELD_BAODAN_iO07      4  // 申报数量 + 报单编号排序 查询排序6
typedef struct {
	int  iM20;  // 席位代码
	char cI10;	// 合约类型
	__int64  iM30;  // 客户编号
} SFILTER_CHENGJIAODAN;  // 成交单筛选条件

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30;  // 客户编号
	int  iM20;  // 交易席位代码
	short sM20_part; // 会员代码（M20的前四位）
	char sO60[LENGTH_CJD + 1]; // 成交单编号
	char cI10;	// 合约类型
	char cO02;  // 买卖方向
	char cO03;  // 开平方向
	char cI00;  // 市场
} SQUERY_CHENGJIAODAN;

#define FIELD_CHENGJIAODAN_NONE      -1 // 仅买卖方向 + 成交单编号排序          查询排序3
#define FIELD_CHENGJIAODAN_iO62_part 0  // 成交时间 + 买卖方向 + 成交单编号排序  查询排序4
#define FIELD_CHENGJIAODAN_iM30      1  // 客户代码 + 买卖方向 + 成交单编号排序  查询排序1
#define FIELD_CHENGJIAODAN_cI10      2  // 合约代码 + 买卖方向 + 成交单编号排序  查询排序2
#define FIELD_CHENGJIAODAN_iO63      3  // 成交价格 + 买卖方向 + 成交单编号排序  查询排序5
#define FIELD_CHENGJIAODAN_iO64      4  // 成交数量 + 买卖方向 + 成交单编号排序  查询排序6

typedef struct {
	int  iM20;  // 交易席位代码
	char cI10;	// 合约类型
	char cO15;  // 报单指令类型
	char cO09;  // 报单状态
	__int64  iM30;  // 客户编号
} SFILTER_JIAOGE; // 交割报单筛选条件

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30;  // 客户编号
	int  iM20;  // 交易席位代码
	short sM20_part; // 会员代码（M20的前四位）
	char cI10;	// 合约类型
	char cO02;  // 买卖方向
} SQUERY_JIAOGE;//交割报单查询

#define FIELD_JIAOGE_NONE     -1  // 仅申报单号排序         查询排序3
#define FIELD_JIAOGE_iT12_part 0  // 申报时间 + 报单编号排序 查询排序4
#define FIELD_JIAOGE_iM30      1  // 客户代码 + 报单编号排序 查询排序1
#define FIELD_JIAOGE_cI10      2  // 合约代码 + 报单编号排序 查询排序2
#define FIELD_JIAOGE_iO07      3  // 申报数量 + 报单编号排序 查询排序5

typedef struct {
	char cO05;  // 是否中立仓   '0'是中立仓，'1'是交割（注意是字符！！！）
	int  iM20;  // 席位代码
	char cI10;	// 合约类型
	__int64  iM30;  // 客户编号
} SFILTER_JG_ZLC_CHENGJIAODAN; //交割、中立仓成交单筛选条件

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30;  // 客户编号
	int  iM20;  // 交易席位代码
	short sM20_part; // 会员代码（M20的前四位）
	char sO60[LENGTH_CJD + 1];  // 成交单编号
	char cI10;	// 合约类型
	char cO02;  // 买卖方向
	char cO05;  // 是否中立仓       0是中立仓，1是交割
} SQUERY_JG_ZLC_CHENGJIAODAN; // 交割、中立仓成交单查询

#define FIELD_JG_ZLC_CHENGJIAODAN_NONE      -1 // 仅买卖方向 + 成交单编号排序          查询排序3
#define FIELD_JG_ZLC_CHENGJIAODAN_iO62_part 0  // 成交时间 + 买卖方向 + 成交单编号排序  查询排序4
#define FIELD_JG_ZLC_CHENGJIAODAN_iM30      1  // 客户代码 + 买卖方向 + 成交单编号排序  查询排序1
#define FIELD_JG_ZLC_CHENGJIAODAN_cI10      2  // 合约代码 + 买卖方向 + 成交单编号排序  查询排序2
#define FIELD_JG_ZLC_CHENGJIAODAN_iO64      3  // 成交数量 + 买卖方向 + 成交单编号排序  查询排序5

typedef struct {
	int  iM20;  // 交易席位代码
	char cI10;	// 合约类型
	char cO15;  // 报单指令类型
	char cO09;  // 订单状态
	__int64  iM30;  // 客户编号
} SFILTER_ZHONGLICANG; // 中立仓报单筛选条件

typedef struct {
	long long iO00; // 报单编号（20位 ：8位交易日 + 2位市场代码 + 2位保留特殊标识 + 8位序列号)
	__int64  iM30;  // 客户编号
	int  iM20;  // 交易席位代码
	short sM20_part; // 会员代码（M20的前四位）
	char cI10;	// 合约类型
	char cO02;  // 买卖方向
} SQUERY_ZHONGLICANG; // 中立仓查询

#define FIELD_ZHONGLICANG_NONE     -1  // 仅申报单号排序         查询排序3
#define FIELD_ZHONGLICANG_iT12_part 0  // 申报时间 + 报单编号排序 查询排序4
#define FIELD_ZHONGLICANG_iM30      1  // 客户代码 + 报单编号排序 查询排序1
#define FIELD_ZHONGLICANG_cI10      2  // 合约代码 + 报单编号排序 查询排序2
#define FIELD_ZHONGLICANG_iO07      3  // 申报数量 + 报单编号排序 查询排序5

typedef struct {
} SFILTER_GONGGAO; // 公告筛选条件

typedef struct {
	int iT80;	// 消息序号
} SQUERY_GONGGAO; // 公告查询

#define FIELD_ZHONGLICANG_NONE     -1  // 仅公告序号排序

// 插入或更新数据，若报单已存在会判断X05是否为新做更新，否则插入并更新索引且已选择筛选则亦更新筛选索引
// 参数: index 表示列表顺序、以INDEX_BAODAN的宏形式调用
// 参数: data 将待插入或更新的数据指针（必须已创建且释放自行处理）
// 返回值: 0为成功，-1为失败
DLL_API_MEMDATA int insertOrUpdateData(int index, void* data);

// 内存数据全量序列化到文件（根据配置定时5分钟调用该函数、以及关闭程序时关闭定时器调用，实际保存成功的文件名会增加 _X05值保存并删除旧文件）
// 参数: path 文件名
// 返回值: 大于0为成功且为X05值，-1为失败
DLL_API_MEMDATA int saveToFile(const char* path);  // 全量保存模型

// 从文件反序化到内存（开始程序时调用）
// 参数: path 文件名
// 返回值: 大于0为成功且为X05值，-1为失败
DLL_API_MEMDATA int loadFromFile(const char* path);

// 获取符合条件的总数据量（有筛选返回的为筛选后的，无则是全量）
// 参数: index 表示列表顺序、以INDEX_BAODAN的宏形式调用
// 返回值: 当前排序筛选模式下符合条件的总数据量
DLL_API_MEMDATA int getCount(int index);

// 获取数据列表的指针
// 参数: index 表示列表顺序、以INDEX_BAODAN的宏形式调用
// 返回值: 数组指针
//DLL_API_MEMDATA void* getPointer(int index);

// 用户设置筛选条件（不涉及排序，排序通过getData处理）
// 参数: index 表示列表顺序、以INDEX_BAODAN的宏形式调用
// 参数: _query 筛选条件结构体（不同的列表为不同的结构体，且数值类型不参与筛选用-1、字符数组不参与筛选全部置0）
DLL_API_MEMDATA int setFilter(int index, void* _filter);

// 注意！！！调用该函数且使用该数据前后，请自行调用_lock(index)和_unlock(index,ret)
// 数据获取（注意，当滚动条在非顶部时若鼠标和滚动条不要通过当前函数取数据，固定以当前的数据序号列表取数据最新状态则可以保持界面报单不变）
// 参数: index 表示列表顺序、以INDEX_BAODAN的宏形式调用
// 参数: field 排序字段、以FIELD_BAODAN_NONE的宏形式调用（除报单单独排序外，均与报单组合排序）
// 参数: asc 排序方向，以SORT_ASC/DESC的宏形式调用
// 参数: absolute 是否为索引绝对位置(以POSITION_的宏形式调用)
// 参数: m 绝对的位置时取数据起始位置（当前排序的第m条）、相对位置时为上次数据偏移量，这里建议鼠标滚动以+1为单位，而拉动滚动条以+翻页值为单位
// 参数: n 最大取数据条数（注意，请以返回值实际条数为准，这里是最大可取回条数）
// 参数: dataList 待获取数据列表（必须已创建且释放自行处理，注意大小要>=n）
// 返回值: 实际取回数据量
DLL_API_MEMDATA SCOUNT getData(int index, int field, bool asc, bool absolute, int m, int n, int* dataList);

// 查询数据（会自动调用排序，但不涉及排序方向，排序方向通过getPageData获取数据处理）
// 参数: index 表示列表顺序、以INDEX_BAODAN的宏形式调用
// 参数: _query 查询条件结构体（不同的列表为不同的结构体，且数值类型不参与查询用-1、字符数组不参与查询全部置0）
// 参数: field 排序字段、以FIELD_BAODAN_NONE的宏形式调用（除报单单独排序外，均与报单组合排序）
// 参数: dataList 待获取数据列表（必须已创建且释放自行处理，注意大小要为当前列表可能最大数据量）
// 返回值: 实际取回数据量
DLL_API_MEMDATA int queryData(int index, void* _query, int field, int* dataList);

// 排序查询数据（仅在查询条件不变时调用，不涉及排序方向，排序方向通过getPageData获取数据处理）
// 参数: index 表示列表顺序、以INDEX_BAODAN的宏形式调用
// 参数: field 排序字段、以FIELD_BAODAN_NONE的宏形式调用（除报单单独排序外，均与报单组合排序）
// 参数: dataList 待获取数据列表（注意，必须是已调用过queryData）
// 参数: count 当前数据列表有效数据数量，通过queryData返回
// 返回值: 实际取回数据量（一般即可count值）
DLL_API_MEMDATA int sortData(int index, int field, int* dataList, int count);

// 将查询出来的数据列表进行分页取数
// 参数: numberPerPage 每页数量
// 参数: pageIndex 当前页
// 参数: asc 排序方式（用SORT_ASC等宏定义调用，注意，field发生改变请重新调用sortData）
// 参数: dataList 当前已排好序的数据列表（注意，必须是已调用过sortData或queryData）
// 参数: count 当前数据列表有效数据数量，通过queryData返回
// 参数: list 待获取当页数据列表（必须已创建且释放自行处理）
// 返回值：实际当页数据量
DLL_API_MEMDATA int getPageData(int numberPerPage, int pageIndex, bool asc, int* dataList, int count, int* list);

//重置内存
DLL_API_MEMDATA int resetMemory();

// 供测试调试使用（请勿在外部使用！！！）
void _update_x05(int x05);

DLL_API_MEMDATA int initMemoryData(int maxOrderCount, int maxMatchCount);

DLL_API_MEMDATA int deinitMemoryData();

DLL_API_MEMDATA int getMaxOrderCount();
DLL_API_MEMDATA int getMaxMatchCount();


#define MODE_NONE   0  // 只查找
#define MODE_INSERT 1  // 查找，未找到则插入索引
#define MODE_DELETE 2  // 查找，找到则删除索引位置



}//namespace mem


#endif
